package com.hll.api.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hll.api.config.web.RespMessage;
import com.hll.api.service.JuheApi;
import com.hll.api.util.HttpUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * 聚合数据api
 *
 * @author 何龙
 * @create 2019-06-02 21:35
 */
@RestController
@RequestMapping("/api")
public class JuheApiController {
    @Resource
    JuheApi juheApi;


    /**
     * @api {get} /api/ip/address 获取ip对应地址
     * @apiVersion 1.0.0
     * @apiName ipAddress
     * @apiGroup network
     * @apiParam {String} key 接口秘钥
     * @apiParam {Integer} [ip] ip地址
     * 不传默认为调用接口的ip
     * @apiParamExample {string} 请求示例:
     * key=123456789&page=1&ip=1.80.149.163
     * @apiSuccess {Number} status 状态码,0为接口访问成功
     * @apiSuccess {String} err 错误信息
     * @apiSuccess {Object} datas 状态为成功时返回信息
     * @apiSuccess {String} datas.Country 国家
     * @apiSuccess {String} datas.Province 省份
     * @apiSuccess {String} datas.City 城市
     * @apiSuccess {String} datas.Isp 运营商
     * @apiSuccessExample {json} 成功示例：
     * {
     * "status": 0,
     * "err": null,
     * "datas":
     * {
     * "Country":"中国",
     * "Province":"陕西省",
     * "City":"西安市",
     * "Isp":"电信"
     * }
     * }
     * @apiErrorExample {json} 返回错误示例:
     * {
     * "status": 2,
     * "err": "秘钥不能为空",
     * "datas": []
     * }
     */
    @GetMapping("/ip/address")
    public RespMessage getIpAddress(String key, String ip, HttpServletRequest request) throws Exception {
        if (key == null) {
            return RespMessage.error( "秘钥不能为空" );
        }
        if (ip == null) {
            ip = HttpUtils.getClientIp( request );
        }
        return RespMessage.success( juheApi.getIpAddress( ip ), null );
    }


    /**
     * @api {get} /api/joke/v1 获取笑话
     * @apiVersion 1.0.0
     * @apiName joke
     * @apiGroup juhe
     * @apiParam {String} key 接口秘钥
     * @apiParam {Integer} [page=1] 页码
     * @apiParam {Integer} [pageSize=1] 每页显示条数<br/>
     * 最大值为20
     * @apiParamExample {string} 请求示例:
     * key=123456789&page=1&pagesize=3
     * @apiSuccess {Number} status 状态码,0为接口访问成功
     * @apiSuccess {String} err 错误信息
     * @apiSuccess {Object[]} datas 笑话数组
     * @apiSuccess {String} datas.unixtime 时间戳
     * @apiSuccess {String} datas.updatetime 时间
     * @apiSuccess {String} datas.hashId id
     * @apiSuccess {String} datas.content 笑话内容
     * @apiSuccessExample {json} 成功示例：
     * {
     * "status": 0,
     * "err": null,
     * "datas": [
     * {
     * "unixtime": 1533516902,
     * "updatetime": "2018-08-06 08:55:02",
     * "hashId": "e008b1674571e09341340a4d48315f14",
     * "content": "马拉松赛场上 在第一名极度领先的情况下， 第二名“哼”的一声果断和第一名分道扬镳， 在他身后的几万名马拉松勇士 个个以为他第一 然后他们跑出了这座城市， 还是没到终点！"
     * },
     * {
     * "unixtime": 1533524101,
     * "updatetime": "2018-08-06 10:55:01",
     * "hashId": "7140e221f30e1a9f5f3ae6cae61a6377",
     * "content": "转朱阁，低绮户，南京今天40度。东风恶，欢情薄，天津气温超全国。剪不断，理还乱，宁波半夜一身汗。秋风清，秋月明，哈尔滨热到人不行。红酥手，黄藤酒，北京半夜热成狗。长亭外，古道边，热的一个人也看不见。。。。"
     * },
     * {
     * "unixtime": 1533524101,
     * "updatetime": "2018-08-06 10:55:01",
     * "hashId": "4d8be78ba9bd0ff89fe95c27bd154c7f",
     * "content": "当你蹲下再站起来时，听到膝盖发出声响，那你要注意了，这说明你的听力挺正常的。"
     * }
     * ]
     * }
     * @apiErrorExample {json} 返回错误示例:
     * {
     * "status": 2,
     * "err": "秘钥不能为空",
     * "datas": []
     * }
     */
    @GetMapping("/joke/v1")
    public RespMessage joke(String key,
                            @RequestParam(value = "page", defaultValue = "1") Integer page,
                            @RequestParam(value = "pageSize", defaultValue = "1") Integer pageSize) {
        if (key == null) {
            return RespMessage.error( "秘钥不能为空" );
        }
        page = page <= 0 ? 1 : page;
        pageSize = pageSize <= 0 ? 1 : pageSize;
        JSONArray joke = juheApi.joke( page, pageSize );
        return RespMessage.success( joke, null );
    }


    /**
     * @api {get} /history/today 历史上的今天
     * @apiVersion 1.0.0
     * @apiName history
     * @apiGroup juhe
     * @apiParam {String} key 接口秘钥
     * @apiParam {String} date 时间,格式:月/日 如:1/1,/10/1,12/12 如月或者日小于10,前面无需加0
     * @apiParamExample {string} 请求示例:
     * key=123456789&date=5/1
     * @apiSuccess {Number} status 状态码,0为接口访问成功
     * @apiSuccess {String} err 错误信息
     * @apiSuccess {Object[]} datas 成功时返回数组
     * @apiSuccess {String} datas.day 日期
     * @apiSuccess {String} datas.date 时间
     * @apiSuccess {String} datas.title 标题
     * @apiSuccess {String} datas.e_id 事件id
     * @apiErrorExample {json} 返回错误示例:
     * {
     * "status": 2,
     * "err": "秘钥不能为空",
     * "datas": []
     * }
     * @apiErrorExample {json} 日期错误示例:
     * {
     * "status": 2,
     * "err": "日期格式错误",
     * "datas": []
     * }
     */
    @GetMapping("/history/today")
    public RespMessage historyToday(String key, String date) throws Exception {
        if (key == null) {
            return RespMessage.error( "秘钥不能为空" );
        }
        if (date == null) {
            return RespMessage.error( "date不能为空" );
        }
        JSONArray objects = juheApi.historyToday( date );
        return RespMessage.success( objects, null );
    }


    /**
     * @api {get} /api/history/today/info 历史今天详情
     * @apiVersion 1.0.0
     * @apiName historyInfo
     * @apiGroup juhe
     * @apiParam {String} key 接口秘钥
     * @apiParam {String} eId 事件id
     * @apiParamExample {string} 请求示例:
     * key=123456789&e_id=175
     * @apiSuccess {Number} status 状态码,0为接口访问成功
     * @apiSuccess {String} err 错误信息
     * @apiSuccess {Object[]} datas 成功时返回数组
     * @apiSuccess {String} datas.picNo 图片个数
     * @apiSuccess {Object[]} datas.picUrl 图片列表
     * @apiSuccess {String} datas.picUrl.pic_title 图片标题
     * @apiSuccess {String} datas.picUrl.id 图片序号
     * @apiSuccess {String} datas.picUrl.url 图片地址
     * @apiSuccess {String} datas.e_id 事件id
     * @apiSuccess {String} datas.title 事件标题
     * @apiSuccess {String} datas.content 事件内容
     * @apiSuccessExample {json} 成功示例：
     * {
     * "status": 0,
     * "err": null,
     * "datas": [
     * {
     * "picNo": "3",
     * "picUrl": [
     * {
     * "pic_title": "找寻勃艮第公爵勇士查理的尸体",
     * "id": 1,
     * "url": "http://images.juheapi.com/history/175_1.jpg"
     * },
     * {
     * "pic_title": "",
     * "id": 2,
     * "url": "http://images.juheapi.com/history/175_2.jpg"
     * },
     * {
     * "pic_title": "勃艮第公爵查理",
     * "id": 3,
     * "url": "http://images.juheapi.com/history/175_3.jpg"
     * }
     * ],
     * "e_id": "175",
     * "title": "勃艮第公爵查理在南锡和瑞士军队交战中阵亡",
     * "content": "    在541年前的今天，1477年1月5日 (农历腊月廿一)，勃艮第公爵查理在南锡和瑞士军队交战中阵亡。\r\n    1477年1月5日，勃艮第公爵查理在南锡和瑞士军队交战中阵亡，勃艮第公国逐渐被法国和哈布斯堡王朝瓜分。\r\n    勃艮第公爵查理(1433年11月10日（距今585年）-1477年1月5日)，勃艮第公爵，能征善战，一心要让公国完全独立，成为欧洲列强，是法王路易十一死敌。虽然勇猛，但论阴谋权术却不如路易，1477年在围攻洛林首府南锡时，以3000兵力面对洛林公爵2万多援军(其中半数为瑞士雇佣军)。查理坚持到战斗最后，终于被一名瑞士长戟兵击中面部阵亡。死后数天，其赤裸的遗体才被发现。查理的死标志着强盛的勃艮第公国走向衰亡。\r\n勃艮第公国(法语：Bourgogne)由理查德伯爵于9世纪建立，包括法国中部和东部一些地区。在腓力二世(大胆者)当政时期(1363年—1404年)，勃艮第公国的军事和政治势力有所扩展，亦获得了佛兰德、阿图瓦、弗朗什孔泰(又称勃艮第伯国)以及其他地区；在腓力三世(好人)当政时期(1419年—1467年)，又获得了布洛涅伯爵领地、卢森堡以及尼德兰的一部分和皮卡第。勃艮第公国在查理公爵(大胆者)统治之下(1467年—1477年)，势力达到顶峰，并与法国争雄。然而，1477年查理公爵在南锡战役中被瑞士击败，公国逐渐被法国和哈布斯堡王朝瓜分。\r\n    当今法国布洛涅行政区大部分地区旧为勃艮第公国属地。\r\n\r\n"
     * }
     * ]
     * }
     * @apiErrorExample {json} 返回错误示例:
     * {
     * "status": 2,
     * "err": "秘钥不能为空",
     * "datas": []
     * }
     * @apiErrorExample {json} 未查询到结果:
     * {
     * "status": 2,
     * "err": "对应参数无结果",
     * "datas": []
     * }
     */
    @GetMapping("/history/today/info")
    public RespMessage historyTodayInfo(String key, Integer eId) throws Exception {
        if (key == null) {
            return RespMessage.error( "秘钥不能为空" );
        }
        if (eId == null) {
            return RespMessage.error( "eId不能为空" );
        }
        JSONArray objects = juheApi.historyTodayIfo( eId );
        return RespMessage.success( objects, null );
    }

}
